外部コンソールアプリでコンパイル
ver1.76 の新機能、「外部コンソールアプリでコンパイル」する機能をご説明します。
今回の例として使用する外部コンソールアプリはWSLの Ubuntu22.04 LTS です。
なお今回の例として挙げるサンプルプログラムはgccとGNU makeがインストールされている環境であれば、
他の環境(MSYS2のMinGWなど)でもコンパイル可能です。
コンパイル機能の説明
本機能は外部コンソールアプリを「ウィンドウ・タイトル」より検索してフォアグラウンドウィンドウにし、
キー入力をシミュレーションすることで外部コンソールアプリにコマンドを入力&実行する機能です。
そのため実行するコマンドに日本語などのマルチバイト文字が含まれていると実行できません。
またキー入力をシミュレーションするだけなので確実に入力されず、
上手く実行できない場合もありますが、その辺は割り切って使うことできっと幸せになれるかもしれません(!?)。
エディタの「コンパイル実行」ボタンを押したらコンパイルコマンドが外部コンソールアプリに入力されて実行が開始されるまでの間(数秒間くらい)は、
何の操作もせずにお待ちください。操作してしまうと正しく入力されない可能性がありますし、
他のアプリケーションにコマンドが入力されてしまう可能性もございます。
サンプルプログラム、メイクファイル、ファイルとフォルダ構成
サンプルプログラム他です。
サンプルプログラムのソースファイルは main.c, main.h, sub.c, sub.h の4つです。
メイクファイルは makefile です。
gcc と GNU make がインストールされている環境であればコンパイルできると思います。
動作確認した環境は WSL の Ubuntu22.04 LTS とMSYS2 の MinGW64 です。
なお、makefileを少し書き換え(/→\\、rmコマンドをdelに)たのと、
コンパイル設定を適切に変更したことで Windows7 + MinGW (cmd.exeで動作するMinGWです) の環境でもコンパイルできましたことを記述しておきます。
一式、ダウンロードはこちらから ⇒ sample.zip
(※実行ファイルだけは含まれていません。)
main.h
// // main.c のヘッダーファイル // extern void sub( void );
main.c
#include <stdio.h> #include "main.h" int main(int argc, char *argv[] ) { sub(); sub(); printf( "hello world!!\n" ); }
sub.h
// // sub.c のヘッダーファイル // extern void sub( void );
sub.c
#include <stdio.h> #include "sub.h" void sub( void ) { printf( "call sub !\n" ); }
makefile
#ソースファイル(すべて列挙します) #ここでは例として main.c と sub.c の2つを列挙しています。 SRC=main.c sub.c SRCS=$(addprifix $(SRCDIR),$(SRC)) SRCDIR=src/ #オブジェクトファイル OBJ = $(SRC:.c=.o) OBJS=$(addprefix $(OBJDIR), $(OBJ)) OBJDIR=obj/ #作成する実行ファイル TARGET=sample.exe #Cコンパイラ CC=gcc #コンパイルオプション #CFLAGS=-Wall -O3 #-Wall はワーニングを表示、 -O3 は最適化オプション CFLAGS= #リンクオプション #LDFLAGS=-mwindows #削除コマンド RM=rm #分割コンパイル(オブジェクトファイル作成) # $@ ターゲットファイル(ここではオブジェクトファイル)名 # $< 最初の依存関係の名前 $(OBJDIR)%.o: $(SRCDIR)%.c $(SRCDIR)%.h $(CC) $(CFLAGS) -o $@ -c $< #デフォルトターゲット .PHONY : all all: $(TARGET) # リンク # $@ ターゲットファイル(ここでは target.exe)名 $(TARGET): $(OBJS) $(CC) $(OBJS) $(LDFLAGS) -o $@ #オブジェクトファイルをすべて削除 .PHONY : clean clean: $(RM) $(OBJS)
ファイルとフォルダ構成
+sample + src (ソースファイル・フォルダ) + main.h + main.c + sub.h + sub.c + obj (オブジェクトが作成されるフォルダ) + sync + 1.txt (自動的に作成される同期ファイル) + makefile + project.tep + project.tep_0176.wi2 + sample.exe (実行ファイル)
手動によるコンパイル方法
あらかじめコンパイルしたい環境のコンソールを開き、gccコマンドとGNU makeコマンドが実行可能なことをご確認ください。
続いてcdコマンドでsampleフォルダに移動し、make[enter]でコンパイルできます。
逆にもし手動でコンパイルできないときは、TEditorMXのコンパイル機能を用いてもコンパイルできませんのでご注意ください。
TEditorMXのコンパイル設定
今回の例では G:\ に今回のサンプルプログラムを配置しました。
ご自身の環境に合わせて適切に変更してください。
設定画面中にある ? はコマンド実行時などに起動時ドライブ名(小文字)が自動的に入ります。
なお、以下の例は WSL の Ubuntu でコンパイルするときの例なのでご了承ください。
TEditorMXのコンパイル設定画面と設定例 (ver1.77の設定画面です)
上の方から順にご説明します。
- 外部コンソールアプリを使用してコンパイルするのでチェックを入れます。
- ウィンドウ・タイトルにはWSLのUbuntuコンソールに表示されているウィンドウタイトルをそのまま入力します。 ただし、ドライブ名だけは ? としておいた方が良いかもしれません。
- 内部コマンドまたはパスの通った外部コマンドにチェックを入れます。
- makeを実行したいのでmakeと入力します。
- 実行オプションには gccの出力(標準とエラーの両方)をすべてmake.logファイルに保存したいのでリダイレクトしています。
- コンパイル終了後、タグファイル(make.log)を情報ウィンドウに読み込んで表示させたいのでチェックを入れます。
- 読み込むタグファイル(make.log)を入力します。
- 同期ファイルはどこでも良いのですが、プロジェクトのフォルダにsyncとか適当な名前を付けて保存できるようにした方が分かりやすいかと思います。
- 外部コンソールのドライブ表現、Ubuntuですと /mnt/(ドライブ文字) なので、ここでは /mnt/? としています。 ?はコマンド実行時などに起動時ドライブ名(小文字)が自動的に入ります。
コンパイル実行
コンパイル設定ができたらWSLのUbuntuを開いてサンプルプログラムのフォルダ(例ではg:\sample)に cd コマンドで移動しておいてから、
TEditorMX側のコンパイル実行ボタン()を押してコンパイルを実行してみましょう。
上手くいけば Ubuntu のウィンドウが手前に表示された後に実行コマンドが入力され、コンパイルが実行されます。
また終了すれば結果が情報ウィンドウに読み込まれます。
上手くコンパイルできないときの対処方法
上手くコンパイルできないときは以下のことを確認してみてください。
- 1.外部コンソールアプリがフォアグラウンドにならない。
- ①対象となる外部コンソールアプリは起動していますか?。
②外部コンソールアプリのウィンドウ・タイトルは正しく設定されていますか?【ver1.77以降では、手入力しなくても【取得】ボタン&外部コンソールクリックでウィンドウ・タイトルを取得できるようになりましたので、ご利用ください。】
半角空白文字なども正確に入力する必要があります。ドライブ文字だけは ? で代用可能です。
- 2.他のアプリに実行コマンドらしきものが入力されてしまう。
-
TEditorMXのコンパイル実行ボタン()を押してすぐに他のアプリのウィンドウをクリックしてしまいますと、
そちらのアプリがフォアグラウンドになってしまい、外部コンソールアプリに正しく入力されないことがあります。
コンパイル実行ボタンを押したらコンパイルが始まるまでの間(数秒くらい)は操作しないで下さい。
- 3.コンパイルが完了しても情報ウィンドウに結果が表示されない。
-
①コンパイル結果を表示させるには実行オプションのところでファイルにリダイレクトする必要があります。
下の画像では make.log というファイルに標準出力と標準エラー出力の両方をリダイレクト(下画像:赤マル)するようにしています。
標準出力と標準エラー出力の両方をリダイレクトするには 2>&1 のようにちょっと変わった感じの表現が必要になります。
②更にリダイレクトしたファイル make.log を読み込むように設定する必要があります(下画像:黄マル)。
- 4.コマンドが文字化けすることがある
-
外部コンソールアプリの状態により、ときどき文字化けすることがあるようです。
小文字入力でアルファベット入力状態(通常のコマンド入力モード?)にしてからコンパイルを実行するようにしてください。